home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / erasedir.zip / ERASEDIR.C next >
C/C++ Source or Header  |  1992-04-05  |  12KB  |  406 lines

  1.  
  2. /*****
  3.  
  4. *****/
  5.  
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <dos.h>
  11. #include <dir.h>
  12. #include <conio.h>
  13.  
  14.  
  15. char cmp_path_1[MAXDIR], cmp_path_2[MAXDIR];
  16. char last_path[MAXDIR], save_working_directory[MAXDIR];
  17. char dir_to_erase[50][MAXDIR], current_drive[4], drive_letter;
  18. char current_directory[MAXDIR];
  19. char root_directory[MAXDIR], delyn;
  20. char next_root[MAXDIR], delete_directory[MAXDIR], parm_switch;
  21. char save_path[MAXPATH], save_drive[MAXDRIVE], save_directory[MAXDIR];
  22. char save_file_name[MAXFILE], save_ext[MAXEXT];
  23.  
  24. int n, num_dir, new_drive, save_working_drive;
  25. int done, i, j, p, b, c, found, rc, switch_c, switch_d;
  26.  
  27. struct ffblk r ;
  28.  
  29. int sort_dir(void);
  30. int change_file_attribute(char *file_name, int new_attr);
  31.  
  32. int main(int argc, char *argv[])
  33. {
  34.  
  35.  clrscr();     /* start program */
  36.  printf("\n\n          ERASEDIR Ver 1.00 \n");
  37.  save_working_drive = getdisk();
  38.  getcwd(save_working_directory, MAXDIR);
  39.   if (argc < 2) {
  40.     printf("*ERROR*   No directory specified.\n");
  41.     printf("          Please re-enter command with correct DRIVE and PATH !");
  42.     printf("\nP R O G R A M   T E R M I N A T E D !\n");
  43.     exit(1);
  44.   }
  45.  strcpy(delete_directory, argv[1]);
  46.  strupr(delete_directory);
  47.  fnsplit(delete_directory, save_drive, save_directory, save_file_name, save_ext);
  48.   if ((strcmp(save_directory, "\\") == 0) &&
  49.       (save_file_name[0] == NULL)) {
  50.     printf("*ERROR*   You can not specify the ROOT DIRECTORY.\n");
  51.     printf("\nP R O G R A M   T E R M I N A T E D !\n");
  52.     exit(1);
  53.   }
  54.  drive_letter = save_drive[0];
  55.  new_drive = drive_letter-'A';
  56.   if (!setdisk(new_drive)) {
  57.    printf("*ERROR*   Drive %s does not exist.\n", save_drive);
  58.    printf("          Please re-enter command with correct DRIVE and PATH !");
  59.    printf("\nP R O G R A M   T E R M I N A T E D !\n");
  60.    exit(1);
  61.   }
  62.   if (chdir(delete_directory)) {
  63.    printf("*ERROR*   Directory %s was not found.\n", delete_directory);
  64.    printf("          Please re-enter command with correct directory name.\n");
  65.    printf("\nP R O G R A M   T E R M I N A T E D !\n");
  66.    exit(1);
  67.   }
  68.  switch_c = 0;
  69.  switch_d = 0;
  70.   if (argc > 2) {
  71.     strupr(argv[2]);
  72.     parm_switch = argv[2][1];
  73.      switch(parm_switch) {
  74.        case 'C':
  75.        switch_c++;
  76.        printf("          CLEAR switch was set ... Directories will be cleared.\n");
  77.        break;
  78.        case 'D':
  79.        switch_d++;
  80.        printf("          DELETE switch was set ... Directories will be deleted.\n");
  81.        break;
  82.        default:
  83.        switch_c++;
  84.        printf("*WARNING* Unknown switch... Directories will be cleared.\n");
  85.        break;
  86.      }
  87.   }
  88.   else {
  89.     switch_c++;
  90.     printf("          Default switch taken... Directories will be cleared.\n");
  91.   }
  92.  sprintf(root_directory, "%s%s", save_drive, save_directory);
  93.  getcwd(current_directory, MAXDIR);
  94.   if (switch_c) {
  95.     printf("\n          %s and all sub-directories will be cleared.\n", delete_directory);
  96.     printf("          Is this correct (Y)/N ? ");
  97.   }
  98.   else {
  99.     printf("\n          %s and all sub-directories will be deleted.\n", delete_directory);
  100.     printf("          Is this correct (Y)/N ? ");
  101.   }
  102.   if (toupper(getch()) == 'N') {
  103.     printf("\n          Please re-enter command with correct parameters.\n");
  104.     printf("\nP R O G R A M   T E R M I N A T E D !\n");
  105.     exit(1);
  106.   }
  107.  printf("\n");
  108.  j=1;
  109.  i=1;
  110.  done = findfirst("*.*", &r, FA_DIREC);
  111.  sprintf(dir_to_erase[0], "%s", current_directory);
  112.   for(;;) {
  113.    while(done) {
  114.     if(dir_to_erase[j][0] == NULL) {
  115.       num_dir=i;
  116.       n=i;
  117.       sort_dir();
  118.        printf("\nDirectories found are:\n");
  119.        for(i=0; i<num_dir; i++) {
  120.      printf("          %s \n", dir_to_erase[i]);
  121.        }
  122.        printf("Number of directories found: %d \n\n", num_dir);
  123.     for(i=num_dir-1, j=num_dir; j>0; i--) {
  124.       if (chdir(dir_to_erase[i])) {
  125.         printf("*ERROR*   Program did not switch to directory %s.\n", dir_to_erase[i]);
  126.         perror("Reason");
  127.         printf("\nP R O G R A M   T E R M I N A T E D !\n");
  128.         exit(1);
  129.       }
  130.     if (switch_d) {
  131.       if (j != num_dir) {
  132.         if (rmdir(dir_to_erase[i+1])) {
  133.           printf("*ERROR*   Directory %s was not removed.\n", dir_to_erase[i+1]);
  134.           perror("Reason");
  135.         }
  136.         else {
  137.           printf("          Directory %s removed.\n", dir_to_erase[i+1]);
  138.         }
  139.       }
  140.     }
  141.     j--;
  142.     /* do hidden files           */
  143.      done = findfirst("*.*", &r, FA_HIDDEN);
  144.      for(; !done; ) {
  145.        if ((r.ff_attrib != FA_DIREC) &&
  146.            (r.ff_name[0] != '.') &&
  147.            (r.ff_attrib != FA_LABEL)) {
  148.          change_file_attribute(r.ff_name, 0);
  149.            if (remove(r.ff_name)) {
  150.          printf("*ERROR*   File %s\\%s was not be deleted.\n", dir_to_erase[i], r.ff_name);
  151.          perror("Reason");
  152.            }
  153.            else {
  154.          printf("          File %s\\%s deleted.\n", dir_to_erase[i], r.ff_name);
  155.            }
  156.        }
  157.        done = findnext(&r);
  158.      }
  159.     /* do read-only files           */
  160.      done = findfirst("*.*", &r, FA_RDONLY);
  161.      for(; !done; ) {
  162.        if ((r.ff_attrib != FA_DIREC) &&
  163.            (r.ff_name[0] != '.') &&
  164.            (r.ff_attrib != FA_LABEL)) {
  165.          change_file_attribute(r.ff_name, 0);
  166.            if (remove(r.ff_name)) {
  167.          printf("*ERROR*   File %s\\%s was not be deleted.\n", dir_to_erase[i], r.ff_name);
  168.          perror("          Reason");
  169.            }
  170.            else {
  171.          printf("          File %s\\%s deleted.\n", dir_to_erase[i], r.ff_name);
  172.            }
  173.        }
  174.        done = findnext(&r);
  175.      }
  176.     /* do system files               */
  177.      done = findfirst("*.*", &r, FA_SYSTEM);
  178.      for(; !done; ) {
  179.        if ((r.ff_attrib != FA_DIREC) &&
  180.            (r.ff_name[0] != '.') &&
  181.            (r.ff_attrib != FA_LABEL)) {
  182.            printf("*WARNING* File %s\\%s is a SYSTEM FILE.\n", dir_to_erase[i], r.ff_name);
  183.            printf("          Delete anyway Y/(N)?  ");
  184.            delyn = getch();
  185.            printf("\n");
  186.          if (toupper(delyn) != 'Y') {
  187.            printf("          File %s\\%s will not be deleted.\n", dir_to_erase[i], r.ff_name);
  188.          }
  189.          else {
  190.            change_file_attribute(r.ff_name, 0);
  191.              if (remove(r.ff_name)) {
  192.                printf("*ERROR*   File %s\\%s was not be deleted.\n", dir_to_erase[i], r.ff_name);
  193.                perror("          Reason");
  194.              }
  195.              else {
  196.                printf("          File %s\\%s deleted.\n", dir_to_erase[i], r.ff_name);
  197.              }
  198.          }
  199.        }
  200.        done = findnext(&r);
  201.      }
  202.         /* do normal files           */
  203.      done = findfirst("*.*", &r, 0);
  204.      for(; !done; ) {
  205.        if ((r.ff_attrib != FA_DIREC) &&
  206.            (r.ff_name[0] != '.') &&
  207.            (r.ff_attrib != FA_LABEL)) {
  208.          if (remove(r.ff_name)) {
  209.            printf("*ERROR*   File %s\\%s was not be deleted.\n", dir_to_erase[i], r.ff_name);
  210.            perror("          Reason");
  211.          }
  212.          else {
  213.            printf("          File %s\\%s deleted.\n", dir_to_erase[i], r.ff_name);
  214.          }
  215.        }
  216.        done = findnext(&r);
  217.      }
  218.      /* do hidden+read-only files       */
  219.      done = findfirst("*.*", &r, FA_HIDDEN+FA_RDONLY);
  220.      for(; !done; ) {
  221.        if ((r.ff_attrib != FA_DIREC) &&
  222.            (r.ff_name[0] != '.') &&
  223.            (r.ff_attrib != FA_LABEL)) {
  224.          change_file_attribute(r.ff_name, 0);
  225.            if (remove(r.ff_name)) {
  226.          printf("*ERROR*   File %s\\%s was not be deleted !\n", dir_to_erase[i], r.ff_name);
  227.          perror("          Reason");
  228.            }
  229.            else {
  230.          printf("          File %s\\%s deleted.\n", dir_to_erase[i], r.ff_name);
  231.            }
  232.        }
  233.        done = findnext(&r);
  234.      }
  235.     /* do system+hidden files       */
  236.      done = findfirst("*.*", &r, FA_SYSTEM+FA_HIDDEN);
  237.      for(; !done; ) {
  238.        if ((r.ff_attrib != FA_DIREC) &&
  239.            (r.ff_name[0] != '.') &&
  240.            (r.ff_attrib != FA_LABEL)) {
  241.            printf("*WARNING* File %s\\%s is a SYSTEM FILE !\n", dir_to_erase[i], r.ff_name);
  242.            printf("          Delete anyway Y/(N)?  ");
  243.            delyn = getch();
  244.            printf("\n");
  245.          if (toupper(delyn) != 'Y') {
  246.            printf("          File %s\\%s will not be deleted.\n", dir_to_erase[i], r.ff_name);
  247.          }
  248.          else {
  249.            change_file_attribute(r.ff_name, 0);
  250.              if (remove(r.ff_name)) {
  251.                printf("*ERROR*   File %s\\%s was not be deleted.\n", dir_to_erase[i], r.ff_name);
  252.                perror("          Reason");
  253.              }
  254.              else {
  255.                printf("          File %s\\%s deleted.\n", dir_to_erase[i], r.ff_name);
  256.              }
  257.          }
  258.        }
  259.        done = findnext(&r);
  260.      }
  261.     /* do system+read-only files       */
  262.      done = findfirst("*.*", &r, FA_SYSTEM+FA_RDONLY);
  263.      for(; !done; ) {
  264.        if ((r.ff_attrib != FA_DIREC) &&
  265.            (r.ff_name[0] != '.') &&
  266.            (r.ff_attrib != FA_LABEL)) {
  267.            printf("*WARNING* File %s\\%s is a SYSTEM FILE !\n", dir_to_erase[i], r.ff_name);
  268.            printf("          Delete anyway Y/(N)?  ");
  269.            delyn = getch();
  270.            printf("\n");
  271.          if (toupper(delyn) != 'Y') {
  272.            printf("          File %s\\%s will not be deleted.\n", dir_to_erase[i], r.ff_name);
  273.          }
  274.          else {
  275.            change_file_attribute(r.ff_name, 0);
  276.              if (remove(r.ff_name)) {
  277.                printf("*ERROR*   File %s\\%s was not be deleted.\n", dir_to_erase[i], r.ff_name);
  278.                perror("          Reason");
  279.              }
  280.              else {
  281.                printf("          File %s\\%s deleted.\n", dir_to_erase[i], r.ff_name);
  282.              }
  283.          }
  284.        }
  285.        done = findnext(&r);
  286.      }
  287.     /* do system+hidden+read-only files       */
  288.      done = findfirst("*.*", &r, FA_SYSTEM+FA_HIDDEN+FA_RDONLY);
  289.      for(; !done; ) {
  290.        if ((r.ff_attrib != FA_DIREC) &&
  291.            (r.ff_name[0] != '.') &&
  292.            (r.ff_attrib != FA_LABEL)) {
  293.            printf("*WARNING* File %s\\%s is a SYSTEM FILE !\n", dir_to_erase[i], r.ff_name);
  294.            printf("          Delete anyway Y/(N)?  ");
  295.            delyn = getch();
  296.            printf("\n");
  297.          if (toupper(delyn) != 'Y') {
  298.            printf("File %s\\%s will not be deleted !\n", dir_to_erase[i], r.ff_name);
  299.          }
  300.          else {
  301.            change_file_attribute(r.ff_name, 0);
  302.              if (remove(r.ff_name)) {
  303.                printf("*ERROR*   File %s\\%s was not be deleted.\n", dir_to_erase[i], r.ff_name);
  304.                perror("          Reason");
  305.              }
  306.              else {
  307.                printf("          File %s\\%s deleted.\n", dir_to_erase[i], r.ff_name);
  308.              }
  309.          }
  310.        }
  311.        done = findnext(&r);
  312.      }
  313.     }
  314.        if (switch_d) {
  315.      if (chdir(root_directory)) {
  316.        printf("*ERROR*   Program did not switch to root directory %s.\n", dir_to_erase[i]);
  317.        perror("Reason");
  318.        printf("\nP R O G R A M   T E R M I N A T E D !\n");
  319.        exit(1);
  320.      }
  321.      if (rmdir(dir_to_erase[0])) {
  322.        printf("*ERROR*   Directory %s was not removed.\n", dir_to_erase[0]);
  323.        perror("Reason");
  324.      }
  325.      else {
  326.        printf("          Directory %s removed.\n", dir_to_erase[0]);
  327.      }
  328.        }
  329.        setdisk(save_working_drive);
  330.        chdir(save_working_directory);
  331.        printf("\n        ERASEDIR completed OK - and with a CRLF.. AMY. \n");
  332.        printf("        Written by James G. Hawkins with saftey in mind.\n");
  333.        return(0);
  334.     }
  335.    chdir(dir_to_erase[j]);
  336.    getcwd(next_root, MAXDIR);
  337.    sprintf(current_directory, "%s", next_root);
  338.    done = findfirst("*.*", &r, FA_DIREC);
  339.    j++;
  340.    }
  341.    if((r.ff_attrib == FA_DIREC) &&
  342.      (r.ff_name[0] != '.')) {
  343.      sprintf(last_path, "%s\\%s", current_directory, r.ff_name);
  344.      sprintf(dir_to_erase[i], "%s\\%s", current_directory, r.ff_name);
  345.      i++;
  346.    }
  347.   done = findnext(&r);
  348.   }
  349. }
  350.  
  351. int sort_dir()
  352. {
  353.  
  354.  found=0;
  355.  i=0;
  356.  j=1;
  357.  c=(n*n)-1;
  358.  n--;
  359.  for(b=0; b<c; b++) {
  360.   strcpy(cmp_path_1, dir_to_erase[i]);
  361.   strcpy(cmp_path_2, dir_to_erase[j]);
  362.    if(strcmp(cmp_path_1, cmp_path_2) > 0) {
  363.      strcpy(dir_to_erase[i], cmp_path_2);
  364.      strcpy(dir_to_erase[j], cmp_path_1);
  365.      found = 1;
  366.    }
  367.   i++;
  368.   j++;
  369.    if(j>n) {
  370.      if(!found) {
  371.        return(0);
  372.      }
  373.      i=0;
  374.      j=1;
  375.      found=0;
  376.    }
  377.  }
  378.  return(0);
  379. }
  380.  
  381. int change_file_attribute(char *file_name, int new_attr)
  382. {
  383.  int f;
  384.  union REGS ireg;
  385.   ireg.h.ah = 0x43;
  386.   ireg.h.al = 1;
  387.   ireg.x.dx = (unsigned) file_name;
  388.   ireg.x.cx = new_attr;
  389.   intdos(&ireg, &ireg);
  390.   if (ireg.x.cflag) {
  391.     perror("*Error* File attribute was not changed");
  392.     printf("\n");
  393.     return(1);
  394.   }
  395.   return(ireg.x.ax);
  396. }
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.